/*
 * HElemento.cpp - Grupo 5 - Prog. Avanzada 2011
 *
 *  Javier Dominguez - 4.901.161-6
 *  Marcelo Parada - 1.977.094-9
 *  Rodrigo Ruiz - 4.481.611-2
 *  Maximiliano Silvera - 4.106.938-6
 */

#include "HElemento.h"

HElemento::HElemento()
{
	sig_id_tema = 1;

	colArtista = new ColConcrete<Artista*>();

	colAlbum = new ColConcrete<Album*>();

	colTema = new ColConcrete<Tema*>();
}

HElemento *HElemento::instance;

HElemento *HElemento::getInstance()
{
	if(instance == NULL)
	{
		instance = new HElemento();
	}

	return instance;
}

ColConcrete<AlbumDT*> *HElemento::obtenerListadoAlbumes()
{
	ColConcrete<AlbumDT*> *listadoAlbumes = new ColConcrete<AlbumDT*>();

	ConcreteIterator<Album*> *iterAlbum = colAlbum->getIterator();

	Album *currAlbum = NULL;

	while(iterAlbum->hasCurrent())
	{
		currAlbum = iterAlbum->current();

		listadoAlbumes->add(new AlbumDT(currAlbum->getNombre(), currAlbum->getAnioEdicion()));

		iterAlbum->next();
	}

	return listadoAlbumes;

}

Pista *HElemento::obtenerPista(int id)
{
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *curr = NULL;

	while(iterTema->hasCurrent())
	{
		curr = iterTema->current();

		if(curr->getId() == id && curr->tipoTema() == Pista::TIPO_TEMA)
		{
			return (Pista*) curr;
		}

		iterTema->next();
	}

	return NULL;
}

Pista *HElemento::obtenerPistaPorTitulo(string titulo)
{
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *curr = NULL;

	while(iterTema->hasCurrent())
	{
		curr = iterTema->current();

		if(curr->getTitulo().compare(titulo) == 0 && curr->tipoTema() == Pista::TIPO_TEMA)
		{
			return (Pista*) curr;
		}

		iterTema->next();
	}

	return NULL;
}

Single *HElemento::obtenerSingle(int id)
{
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *curr = NULL;

	while(iterTema->hasCurrent())
	{
		curr = iterTema->current();

		if(curr->getId() == id && curr->tipoTema() == Single::TIPO_TEMA)
		{
			return (Single*) curr;
		}

		iterTema->next();
	}

	return NULL;
}

Single *HElemento::obtenerSinglePorTitulo(string titulo)
{
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *curr = NULL;

	while(iterTema->hasCurrent())
	{
		curr = iterTema->current();

		if(curr->getTitulo().compare(titulo) == 0 && curr->tipoTema() == Single::TIPO_TEMA)
		{
			return (Single*) curr;
		}

		iterTema->next();
	}

	return NULL;
}

Tema *HElemento::obtenerTema(int id)
{
	ConcreteIterator<Tema*> *iterTema = colTema->getIterator();

	Tema *curr = NULL;

	while(iterTema->hasCurrent())
	{
		curr = iterTema->current();

		if(curr->getId() == id)
		{
			return curr;
		}

		iterTema->next();
	}

	return NULL;
}

Artista *HElemento::obtenerArtista(string nombre)
{
	ConcreteIterator<Artista*> *iterArtista = colArtista->getIterator();

	Artista* curr;

	while(iterArtista->hasCurrent())
	{
		curr = iterArtista->current();

		if(curr->getNombre().compare(nombre) == 0)
		{
			return curr;
		}

		iterArtista->next();
	}

	return NULL;
}

Album *HElemento::obtenerAlbum(string nombre)
{
	ConcreteIterator<Album*> *iterAlbum = colAlbum->getIterator();

	Album *curr;

	while(iterAlbum->hasCurrent())
	{
		curr = iterAlbum->current();

		if(curr->getNombre().compare(nombre) == 0)
		{
			return curr;
		}

		iterAlbum->next();
	}

	return NULL;
}

void HElemento::crearArtista(ArtistaDT *artistaDT)
{
	if(artistaDT->tipoArtistaDT() == Solista::TIPO_ARTISTA)
	{
		SolistaDT *solistaDT = (SolistaDT*) artistaDT;

		colArtista->add(new Solista(solistaDT->getNombre()));
	}
	else if(artistaDT->tipoArtistaDT() == Banda::TIPO_ARTISTA)
	{
		BandaDT *bandaDT = (BandaDT*) artistaDT;

		colArtista->add(new Banda(bandaDT->getNombre(), bandaDT->getIntegrantes()));
	}
}

void HElemento::crearAlbum(AlbumDT *albumDT)
{
	colAlbum->add(new Album(albumDT->getNombre(), albumDT->getAnioEdicion()));
}

int HElemento::crearTema(TemaDT *temaDT)
{
	int idTema = this->sig_id_tema++;

	if(temaDT->tipoTemaDT() == Single::TIPO_TEMA)
	{
		SingleDT *singleDT = (SingleDT*) temaDT;

		colTema->add(new Single(idTema, singleDT->getAnioGrabacion(), singleDT->getTitulo(), singleDT->getTiempo()));
	}
	else if(temaDT->tipoTemaDT() == Pista::TIPO_TEMA)
	{
		PistaDT *pistaDT = (PistaDT*) temaDT;

		colTema->add(new Pista(idTema, pistaDT->getNumero(), pistaDT->getTitulo(), pistaDT->getTiempo()));
	}

	return idTema;
}

void HElemento::asociarAlbumPista(AlbumDT *albumDT, PistaDT *pistaDT)
{
	Album *album = obtenerAlbum(albumDT->getNombre());

	Pista *pista = obtenerPista(pistaDT->getId());

	if(album == NULL)
	{
		throw string("El album no existe.");
	}

	if(pista == NULL)
	{
		throw string("La pista no existe.");
	}

	pista->setAlbum(album);
}

void HElemento::asociarArtistaTema(ArtistaDT *artistaDT, TemaDT *temaDT)
{
	Artista *artista = obtenerArtista(artistaDT->getNombre());

	Tema *tema = obtenerTema(temaDT->getId());

	if(artista == NULL)
	{
		throw string("El artista no existe.");
	}

	if(tema == NULL)
	{
		throw string("El tema no existe.");
	}

	tema->getArtistas()->add(artista);
}

void HElemento::asociarArtistaAlbum(ArtistaDT *artistaDT, AlbumDT *albumDT)
{
	Artista *artista = obtenerArtista(artistaDT->getNombre());

	Album *album = obtenerAlbum(albumDT->getNombre());

	if(artista == NULL)
	{
		throw string("El artista no existe.");
	}

	if(album == NULL)
	{
		throw string("El album no existe.");
	}

	album->getArtistas()->add(artista);
}

HElemento::~HElemento()
{
	delete instance;

	delete colArtista;

	delete colAlbum;

	delete colTema;
}
